<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    /*
       let和var的相同点：
            在全局声明的变量就是全局变量，在局部声明的变量是局部变量
        不同点：
            1、let声明的变量不能提升
            2、let声明的变量不能重复声明
            3、let声明的变量只在当前块作用域中有效  (块作用域 {})
            4、let声明的变量会产生暂时性的死区，只能在当前块作用域中查找
    */
</script>
<script>
    // var num = 10
    let num = 20
    function fn() {
        // var str = '哈哈'
        let str = '哈哈'
        console.log(num);
    }
    console.log(str);
    fn()
</script>
<script>
    console.log(demo);  // 在初始化之前无法访问demo
    // var demo = 30
    let demo = 30
</script>
<script>
    // var str = '嘿嘿'
    // var str = '呵呵'

    let str = '嘿嘿'
    // let str = '呵呵'
    console.log(str);
</script>

<script>
    // var demo_1
    if (false) {
        let demo_1 = 40
    }
    console.log(demo_1);
</script>
<script>
    // console.log(demo_2);
</script>
<script>
    var name = 'zs'
    if (1) {
        console.log(name);
        let name = 'ls'
    }
</script>
<script>
    /* 
      const 
            1、const声明的变量必须赋初值
            2、const声明的变量是常量，不能发生改变
            3、const声明的变量不能提升
            4、const声明的变量不能重复声明
            5、const声明的变量只在当前块作用域中有效
            6、const声明的变量会产生暂时性的死区，只能在当前块作用域中查找
    */
    const name_1 = ''
    name_1 = 'ls'
    console.log(name_1);
</script>
<script>
    console.log(name_2);
    const name_2 = 'zs'
    // const name_2
</script>
<script>
    var name_3 = 'cy'
    if (2) {
        console.log(name_3);

        const name_3 = 'cs'
    }

    // console.log(name_3);
</script>

</html>